// Zombie Monster for KF Invasion gametype
class ZombieCrawler_Base extends SRKFMonster;

var() float PounceSpeed;
var bool bPouncing;

var(Anims)  name    MeleeAirAnims[3]; // Attack anims for when flying through the air

//-------------------------------------------------------------------------------
// NOTE: All Code resides in the child class(this class was only created to
//         eliminate hitching caused by loading default properties during play)
//-------------------------------------------------------------------------------

function bool DoPounce()
{
	if ( 	bIsCrouched || bWantsToCrouch || (Physics != PHYS_Walking) || 
			VSize(Location - Controller.Target.Location) > (MeleeRange * 5) )
		return false;

	Velocity = Normal(Controller.Target.Location-Location)*PounceSpeed;
	Velocity.Z = JumpZ;
	SetPhysics(PHYS_Falling);
	ZombieSpringAnim();
	bPouncing=true;
	return true;
}

simulated function ZombieSpringAnim()
{
	SetAnimAction('ZombieSpring');
}

event Landed(vector HitNormal)
{
	bPouncing=false;
	Super.Landed(HitNormal);
}

event Bump(Actor Other)
{
	if(KFHumanPawn(Other)==none && SRKFHumanPawn(Other)!=none)
	{
		Log("CrawlerBase None Error 1");
	}
	// TODO: is there a better way
	if(bPouncing && KFHumanPawn(Other)!=none )
	{
		KFHumanPawn(Other).TakeDamage(((MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1))), self ,self.Location,self.velocity, class 'KFmod.ZombieMeleeDamage');
		if (KFHumanPawn(Other).Health <=0)
		{
			//TODO - move this to humanPawn.takedamage? Also see KFMonster.MeleeDamageTarget
			KFHumanPawn(Other).SpawnGibs(self.rotation, 1);
		}
		//After impact, there'll be no momentum for further bumps
		bPouncing=false;
	}
}

// Blend his attacks so he can hit you in mid air.
simulated function int DoAnimAction( name AnimName )
{
	if( AnimName=='InAir_Attack1' || AnimName=='InAir_Attack2' )
	{
		AnimBlendParams(1, 1.0, 0.0,, FireRootBone);
		PlayAnim(AnimName,, 0.0, 1);
		return 1;
	}

	if( AnimName=='HitF' )
	{
		AnimBlendParams(1, 1.0, 0.0,, NeckBone);
		PlayAnim(AnimName,, 0.0, 1);
		return 1;
	}

	if( AnimName=='ZombieSpring' )
	{
		PlayAnim(AnimName,,0.02);
		return 0;
	}

	return Super.DoAnimAction(AnimName);
}

simulated event SetAnimAction(name NewAction)
{
	local int meleeAnimIndex;

	if( NewAction=='' )
		return;
	if(NewAction == 'Claw')
	{
		meleeAnimIndex = Rand(2);
		if( Physics == PHYS_Falling )
		{
			NewAction = MeleeAirAnims[meleeAnimIndex];
		}
		else
		{
			NewAction = meleeAnims[meleeAnimIndex];
		}
		CurrentDamtype = ZombieDamType[meleeAnimIndex];
	}
	ExpectingChannel = DoAnimAction(NewAction);

	if( AnimNeedsWait(NewAction) )
	{
		bWaitForAnim = true;
	}

	if( Level.NetMode!=NM_Client )
	{
		AnimAction = NewAction;
		bResetAnimAct = True;
		ResetAnimActTime = Level.TimeSeconds+0.3;
	}
}

// The animation is full body and should set the bWaitForAnim flag
simulated function bool AnimNeedsWait(name TestAnim)
{
	if( TestAnim == 'ZombieSpring' || TestAnim == 'DoorBash' )
	{
		return true;
	}
	return false;
}

function bool FlipOver()
{
	return false;
}

defaultproperties
{
	DrawScale=1.1
	Prepivot=(Z=0.0)

	MoanVoice=Sound'KF_EnemiesFinalSnd.Crawler_Talk'
	DeathSound(0)=Sound'KF_EnemiesFinalSnd.Crawler_Death'
	JumpSound=Sound'KF_EnemiesFinalSnd.Crawler_Jump'
	ChallengeSound(0)=Sound'KF_EnemiesFinalSnd.Crawler_Acquire'
	ChallengeSound(1)=Sound'KF_EnemiesFinalSnd.Crawler_Acquire'
	ChallengeSound(2)=Sound'KF_EnemiesFinalSnd.Crawler_Acquire'
	ChallengeSound(3)=Sound'KF_EnemiesFinalSnd.Crawler_Acquire'

	PounceSpeed=330.000000   // 300
	MeleeAnims(0)="ZombieLeapAttack"
	MeleeAnims(1)="ZombieLeapAttack2"//"ZombieLeapAttack"
	//MeleeAnims(2)="ZombieLeapAttack2"//"LeapAttack3"
	MeleeAirAnims(0)="InAir_Attack1"
	MeleeAirAnims(1)="InAir_Attack2"//"ZombieLeapAttack"
	//MeleeAirAnims(2)="InAir_Attack2"//"LeapAttack3"
	bStunImmune=True

	AmbientSound=Sound'KF_BaseCrawler.Crawler_Idle'
	MeleeDamage=6
	damageForce=5000
	HitSound(0)=Sound'KF_EnemiesFinalSnd.Crawler_Pain'
	ScoringValue=10
	IdleHeavyAnim="ZombieLeapIdle"
	IdleRifleAnim="ZombieLeapIdle"
	GroundSpeed=140.000000
	WaterSpeed=130.000000
	JumpZ=350.000000
	Health=70//100
	HealthMax=70//100
	MovementAnims(0)="ZombieScuttle"
	MovementAnims(1)="ZombieScuttleB"
	MovementAnims(2)="ZombieScuttleL"
	MovementAnims(3)="ZombieScuttleR"
	TurnLeftAnim= "TurnLeft"
	TurnRightAnim= "TurnRight"
	WalkAnims(0)="ZombieScuttle"
	WalkAnims(1)="ZombieScuttleB"
	WalkAnims(2)="ZombieScuttleL"
	WalkAnims(3)="ZombieScuttleR"
	AirAnims(0)="ZombieSpring"
	AirAnims(1)= "ZombieSpring"
	AirAnims(2)="ZombieSpring"
	AirAnims(3)="ZombieSpring"
	TakeoffAnims(0)= "ZombieSpring"
	TakeoffAnims(1)= "ZombieSpring"
	TakeoffAnims(2)= "ZombieSpring"
	TakeoffAnims(3)= "ZombieSpring"
	LandAnims(0)= "Landed"
	LandAnims(1)="Landed"
	LandAnims(2)="Landed"
	LandAnims(3)="Landed"
	AirStillAnim="ZombieSpring"
	TakeoffStillAnim="ZombieLeapIdle"//"ZombieLeap"
	IdleCrouchAnim="ZombieLeapIdle"
	IdleWeaponAnim="ZombieLeapIdle"
	IdleRestAnim="ZombieLeapIdle"
	Mesh=SkeletalMesh'KF_Freaks_Trip.Crawler_Freak'
	Skins(0)=Combiner'KF_Specimens_Trip_T.crawler_cmb'
	CollisionRadius=26.000000
	CollisionHeight=25.000000
	HitAnims(0)="HitF"
	HitAnims(1)="HitF"
	HitAnims(2)="HitF"
	KFHitFront="HitF"
	KFHitBack="HitF"
	KFHitLeft="HitF"
	KFHitRight="HitF"
	KFRagdollName="Crawler_Trip"
	bCannibal = true
	bCrawler = true
	bOrientOnSlope = true
	MenuName="Crawler"
	Intelligence=BRAINS_Mammal
	ZombieFlag=2
	bDoTorsoTwist=false

	SeveredHeadAttachScale=1.1
	SeveredLegAttachScale=0.85
	SeveredArmAttachScale=0.8
	MeleeAttackHitSound=sound'KF_EnemiesFinalSnd.Crawler_HitPlayer'
	HeadHeight=2.5
	HeadScale=1.05
	CrispUpThreshhold=10
	OnlineHeadshotOffset=(X=28,Y=0,Z=7)
	OnlineHeadshotScale=1.2
	MotionDetectorThreat=0.34
}